#include <iostream>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <string>

#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

int main()
{
    // 1. 创建管道
    int pipefd[2] = {0};
    int n = pipe(pipefd);
    assert(n != -1); // 断言release下就没有了
    (void)n; // 没有断言n就是只被定义而没有被使用，这只是让他被使用

    // 2. 创建子进程
    pid_t id = fork();
    assert(id != -1);
    if (id == 0)
    {
        // 子进程
        // 3. 构建单项通道，父进程写入，子进程读取
        // 3.1 关闭子进程不需要的fd
        close(pipefd[1]);
        char buffer[1024];
        while (true)
        {
            ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);

            if (s > 0)
            {
                buffer[s] = 0;
                cout << "child get a message[" << getpid() << "] father: " << buffer << endl;
            }
        }

    }
    // 父进程
    // 3. 构建单项通道
    close(pipefd[0]);

    string message = "I am father";
    int count = 0;
    char send_buffer[1024];
    while (true)
    {
        // 3.2 构建变化的字符串
        snprintf(send_buffer, sizeof(send_buffer), "%s[%d] : %d", message.c_str(), getpid(), count++); // 格式化输出到send_buffer

        // 3.3 写入
        write(pipefd[1], send_buffer, strlen(send_buffer));
        sleep(1);
    }
    close(pipefd[1]);

    pid_t ret = waitpid(id, nullptr, 0);
    assert(ret > 0);
    (void)ret;


    return 0;
}